/**
 * 
 */
package co.com.smart.eagle.client.view.impl;

import java.util.ArrayList;
import java.util.List;

import co.com.smart.eagle.client.view.CrearUsuariosView;
import co.com.smart.eagle.client.view.impl.components.SmartImageCell;
import co.com.smart.eagle.client.view.impl.smartcelltable.SmartCellTable;
import co.com.smart.eagle.client.view.impl.smartduallist.DualListView;
import co.com.smart.eagle.client.view.impl.smartsimplepager.SmartSimplePager;
import co.com.smart.eagle.infrastructure.dto.RolesDTO;
import co.com.smart.eagle.infrastructure.dto.UsuariosDTO;

import com.google.gwt.cell.client.FieldUpdater;
import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Style;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.cellview.client.Column;
import com.google.gwt.user.cellview.client.TextColumn;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.PasswordTextBox;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.view.client.ListDataProvider;
import com.sencha.gxt.widget.core.client.button.TextButton;
import com.sencha.gxt.widget.core.client.event.SelectEvent;
import com.sencha.gxt.widget.core.client.event.SelectEvent.SelectHandler;

/**
 * @author Andres Felipe Escobar Lopez
 *
 */
public class CrearUsuariosViewImpl extends Composite implements CrearUsuariosView{
	
	private Presenter presenter;
	
	@UiField protected TextButton btnGrabar;
	@UiField protected TextButton btnConsultar;
	@UiField protected TextButton btnLimpiar;
	@UiField protected TextBox txtUsuario;
	@UiField protected PasswordTextBox txtPass;
	@UiField protected PasswordTextBox txtConfirmarPass;
	@UiField(provided = true) protected SmartSimplePager paginador;
	@UiField
	protected SmartCellTable<UsuariosDTO> tblUsuarios;
	private ListDataProvider<UsuariosDTO> dataProvider = new ListDataProvider<UsuariosDTO>();
	@UiField
	protected DualListView<RolesDTO> dualList;
	
	private static CrearUsuariosViewImplUiBinder uiBinder = GWT
			.create(CrearUsuariosViewImplUiBinder.class);
	
	public enum FocusUserPlace{
		USER,
		PASS,
		CONFIRM_PASS,
		BTN_SAVE,
		BTN_SEARCH,
		BTN_CLEAN;
	}

	interface CrearUsuariosViewImplUiBinder extends
			UiBinder<Widget, CrearUsuariosViewImpl> {
	}

	public CrearUsuariosViewImpl() {
		paginador 		= new SmartSimplePager();
		initWidget(uiBinder.createAndBindUi(this));
		initWidgets();
		cleanForm();
	}
	
	public void initWidgets() {
		
		createTableUser();
		tblUsuarios.setVisible(true);
		btnLimpiar.addSelectHandler(new SelectHandler() {
			
			@Override
			public void onSelect(SelectEvent event) {
				cleanForm();
				presenter.cargarRoles();
				presenter.getUsers();
			}
		});
		
		btnGrabar.addSelectHandler(new SelectHandler() {
			
			@Override
			public void onSelect(SelectEvent event) {
				if(presenter.validateCreateUser()){
					 presenter.crearUsuario();
				}
			}
		});
		
		btnConsultar.addSelectHandler(new SelectHandler() {
			
			@Override
			public void onSelect(SelectEvent event) {
				presenter.getUsers();
			}
		});
		
		dualList.setTituloListaIzquierda("Roles disponibles");
		dualList.setTituloListaDerecha("Roles por usuario");
	}
	
	/**
	 * Crea la tabla de usuarios
	 */
	public void createTableUser() {
		if (tblUsuarios.getColumnCount() <= 0) {
			
			TextColumn<UsuariosDTO> userColumn = new TextColumn<UsuariosDTO>() {
				@Override
				public String getValue(UsuariosDTO user) {
					return user.getDsUser();
				}

			};

			TextColumn<UsuariosDTO> claveColumn = new TextColumn<UsuariosDTO>() {
				@Override
				public String getValue(UsuariosDTO user) {
					return "**********";
				}
			};

			TextColumn<UsuariosDTO> rolesColumn = new TextColumn<UsuariosDTO>() {
				@Override
				public String getValue(UsuariosDTO user) {
					StringBuffer roles = new StringBuffer();
					int i = 0;
					for(RolesDTO rol : user.getRoles()){
						
						roles.append(rol.getDsRol());
						
						if((i+1)< user.getRoles().size()){
							roles.append(",");
						}
						++i;
					}
					return roles.toString();
				}
			};
			
			SmartImageCell imageEditar = new SmartImageCell("Editar usuario");
			Column<UsuariosDTO, String> editarColumn = new Column<UsuariosDTO, String>(imageEditar) {
				
				@Override
				public String getValue(UsuariosDTO object) {
					return "images/icoSeleccionar.png,true";
				}
			};
			
			editarColumn.setFieldUpdater(new FieldUpdater<UsuariosDTO, String>() {
				
				@Override
				public void update(int index, UsuariosDTO object, String value) {
					presenter.editUser(object);
				}
			});
			
			SmartImageCell imageEliminar = new SmartImageCell("Eliminar usuario");
			Column<UsuariosDTO, String> eliminarColumn = new Column<UsuariosDTO, String>(imageEliminar) {
				
				@Override
				public String getValue(UsuariosDTO object) {
					return "images/icoDelete.png,true";
				}
			};
			
			eliminarColumn.setFieldUpdater(new FieldUpdater<UsuariosDTO, String>() {
				
				@Override
				public void update(int index, UsuariosDTO object, String value) {
					if(Window.confirm("Esta seguro que desea eliminar el usuario ?")){
						presenter.deleteUser(object);
					}
				}
			});


			tblUsuarios.setTitle("Lista de usuarios");
			tblUsuarios.setAutoHeaderRefreshDisabled(true);
			tblUsuarios.setWidth("100%");
			tblUsuarios.setEmptyTableWidget(new Label("Sin Datos"));
			
			tblUsuarios.addColumn(userColumn,"Usuario");
			tblUsuarios.setColumnWidth(userColumn, 200, Style.Unit.PX);
			userColumn.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER);
			
			tblUsuarios.addColumn(claveColumn, "Clave");
			tblUsuarios.setColumnWidth(claveColumn, 200, Style.Unit.PX);
			claveColumn.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER);
			
			tblUsuarios.addColumn(rolesColumn, "Roles");
			tblUsuarios.setColumnWidth(rolesColumn, 400, Style.Unit.PX);
			rolesColumn.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER);
			
			tblUsuarios.addColumn(editarColumn);
			tblUsuarios.setColumnWidth(editarColumn, 30, Style.Unit.PX);
			editarColumn.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER);
			
			tblUsuarios.addColumn(eliminarColumn);
			tblUsuarios.setColumnWidth(eliminarColumn, 30, Style.Unit.PX);
			eliminarColumn.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER);
			
			dataProvider.addDataDisplay(tblUsuarios);
			paginador.setDisplay(tblUsuarios);
		}
	}

	@Override
	public void setPresenter(Presenter presenter) {
		this.presenter = presenter;
	}

	@Override
	public void setUserName(String value) {
		this.txtUsuario.setText(value);
	}

	@Override
	public void setPassword(String value) {
		this.txtPass.setText("");
	}

	@Override
	public boolean validatefields() {
		return false;
	}

	@Override
	public void cleanForm() {
		setUserName("");
		setPassword("");
		setPassWordConfirm("");
		setEnableTxtUser(true);
		this.txtUsuario.setFocus(true);
		setTextBtnGrabar("Grabar");
		setUsers(new ArrayList<UsuariosDTO>());
		limpiarListas();
	}

	@Override
	public void setPassWordConfirm(String value) {
		this.txtConfirmarPass.setText(value);
	}

	@Override
	public String getUserName() {
		return this.txtUsuario.getText();
	}

	@Override
	public String getPassWord() {
		return this.txtPass.getText();
	}

	@Override
	public String getPassWordConfirm() {
		return this.txtConfirmarPass.getText();
	}

	@Override
	public void addResultUser(UsuariosDTO user) {
		
	}

	@Override
	public void romoveUser(int index) {
		
	}

	@Override
	public void setUsers(List<UsuariosDTO> users) {
		
		dataProvider.getList().clear();
		dataProvider.getList().addAll(users);
		
	}
	
	@Override
	public void setRoles(List<RolesDTO> roles) {
       dualList.addItemsDisponibles(roles);		
	}
	
	@Override
	public void setRolesPorUsuario(List<RolesDTO> roles) {
		dualList.addItemSeleccionados(roles);		
	}
	
	@Override
	public List<RolesDTO> getRolesPorUsuario()
	{		
		return dualList.getItemsSeleccionados();			
	}
	
	private void limpiarListas()
	{
		dualList.limpiar();
	}
	
	@Override
	public void setFocus(FocusUserPlace focus) {
		
		switch (focus) {
		case USER:
			this.txtUsuario.setFocus(true);
			break;
		case PASS:
			this.txtPass.setFocus(true);
			break;
		case CONFIRM_PASS:
			this.txtConfirmarPass.setFocus(true);
			break;
		case BTN_SAVE:
			this.btnGrabar.focus();
			break;
		case BTN_SEARCH:
			this.btnConsultar.focus();
			break;
		case BTN_CLEAN:
			this.btnLimpiar.focus();
			break;
		default:
			this.txtUsuario.setFocus(true);
			break;
		}
		
	}

	@Override
	public void setEnableTxtUser(boolean value) {
	   this.txtUsuario.setEnabled(value);
	}
	
	@Override
	public void setTextBtnGrabar(String text) {
		this.btnGrabar.setText(text);
	}
	
	@Override
	public boolean isEnabledUser() {
		return this.txtUsuario.isEnabled();
	}

}
